package com.tedu.day02.oop;

/**
 * 抽象类与抽象方法  关键字：abstract
 * 类：只能提供行为概念，没有具体实现行为
 *
 * 抽象类与面向对象----多态绝对关系【向上造型创建抽象对象】
 * 使用多态创建抽象类对象，抽象类本身无法创建对象，需要使用多态完成抽象类创建
 *
 * 什么是使用抽象类？
 * 复杂项目时，需要在不同类下实现不同的功能，首先抽象类【Android常用】
 *
 * 定义抽象类与抽象方法？
 *抽象类： 修饰符 abstract class 类名{}  ----毫无意义，必须结合抽象方法
 * 抽象方法：修饰符 abstract 返回值 方法（参数）；---没有具体的实现
 *
 * 抽象类“实例化：创建对象”：抽象类自身无法实例化
 * ①创建【N个】子类，继承抽象【父】类，子类一定实现【父】类的所有抽象方法
 * ②使用面向对象：多态【向上造型】 抽象类 引用=new  【实现】子类（）;
 * 注意：抽象类一定发生重写，子类继承重写【父】类，也可以叫做“实现类”！
 */
abstract class Animals{ //抽象类
    //抽象方法:没有具体的实现【代码块】-----一定继承-----一定多态性【造型】
    public abstract void say();
    //①定义由final修饰的抽象方法  ？ ×
   // public final abstract void sleep();
    //②定义抽象变量 ？              ×
   //  abstract int i=1;
    //③定义静态变量  ？             √
     static int i=1;
     //④ 定义静态抽象变量 ？         ×
    // static abstract int j=1;
    //⑤定义静态的抽象方法【无实现】    ×
  //  public static abstract  void eat();
    //⑥定义静态的方法【无实现：空代码块】 √
     public static  void eat(){};
     //⑤⑥总结：抽象方法|静态方法，方法定义：修饰符 static|abstract 返回值 方法名
        //⑦可以定义内部类：静态内部类    √
   static class Sos{}
   // ⑧抽象类有构造器吗？               √
    public Animals() {
    }
    //⑨抽象类普通实现方法？             √
    public void run(){}
}
//⑩抽象类可以继承抽象类？      √   实现：两个抽象类---形容一个实现
abstract  class Thing extends  Animals{
    public abstract void sleep();
}
//目的：两个抽象类中的所有抽象方法---继承【子】抽象类

//实现类：实现抽象[父]类的方法-----多个实现类----继承----抽象
class Person1 extends Animals {//报错原因：完成重写
    public void say() {
        System.out.println("人----说话~");
    }
}
 public class 抽象类 {
     public static void main(String[] args) {
         //抽象类无法创建对象:提供抽象方法--必须由子类实现---多态【造型】
         Animals a=new Person1();
         a.say(); //向上造型--重写：抽象【父】类的抽象方法【覆盖】
     }
}
